import { Method } from 'axios'

/**
 * 请求返回的数据格式
 */
export interface IResponse {
    data: any;                      // 返回体
    status: number;                 // 返回状态
}

/**
 * 请求成功的数据格式
 */
export interface IResolve {
    data: any;                      // 返回体
}

/**
 * requestHook
 */
export interface IRequestHook {
    type: boolean;                  // 请求拦击器返回状态
    message: string;                // 请求拦击器返回信息
}

/**
* 失败类型
* fail     业务判断失败类型
* error    请求出现错误类型
*/
export type failType =
    | 'fail' | 'error'

/**
* 失败位置
*/
export type failPosition =
    | 'request' | 'response'

/**
* 请求/返回失败信息格式
*/
export interface IRejectType {
    type: failType;                 // 失败类型
    position: failPosition;         // 失败位置
    message: any;                   // 错误信息
}

/**
 * 请求拦截器格式
 */
export interface InterceptorsConfig {
    request?: (options: IRequestConfig, apiControl: IApiControl) => IRequestHook;
    response?: (response: IResponse, options: IRequestConfig, apiControl: IApiControl) => Promise<any> | IResolve;
}

/**
 * 接口流程控制参数
 */
export interface IApiControl {
    auth?: Boolean;                 // 鉴权开关
    tip?: boolean;                  // 是否开启提示信息,true则请求异常会调用 tipFn()
    tipFn?: (message: IRejectType) => void; // 提示信息函数
    reslog?: boolean;               // 是否开启返回结果打印
    debounce?: boolean;             // 是否开启请求防抖
    resCache?: boolean;             // 请求结果缓存
    chacheExpires?: number;         // 请求结果缓存到期时间
    debounceFn?: () => void;        // 请求防抖时提示函数
    finally?: (options: IRequestConfig) => void;       // 请求完成后的回调
    interceptors?: InterceptorsConfig,                 // 请求拦截器
    extraCache?: (url: string, value: any) => void;    // 额外的缓存处理
}

/**
 * 请求配置格式
 */
export interface IRequestConfig {
    url: string;                    // 请求地址
    baseURL?: string;               // 接口根路径
    headers?: any;                  // 请求头
    method?: Method;                // 请求类型
    timeout?: number;               // 请求超时时间(毫秒)
    data?: any;                     // post 请求参数
    params?: any;                   // get 请求参数
    other?: any;                    // 其他请求参数
}